<?php

namespace App\Services;

use App\Models\Banner;
use App\Models\BannerItem;
use Illuminate\Support\Facades\DB;

class BannerService extends BaseService
{
    /**
     * 获取 banner位 数据列表
     * @param int $page
     * @param int $limit
     * @param string $sortField
     * @param string $orderRule
     * @return mixed
     */
    public function getBannerList(int $page, int $limit, string $sortField = '', string $orderRule = 'asc'): mixed
    {
        $query = Banner::query();

        if (!empty($sortField)) {
            $query->orderBy($sortField, $orderRule);
        }

        $paginator = $query->paginate($limit, ['*'], 'page', $page);
        return $this->optimizationPaginate($paginator);
    }

    /**
     * 根据 banner位 id 获取当前 banner位 下的所有图片
     * @param int $bannerId
     * @return array
     */
    public function getBannerItem(array $input): array
    {
        // return BannerItem::query()->where('banner_id', '=', $bannerId)->orderBy('sort')->get()->toArray();
        return Banner::getBannerById($input)->toArray();
    }

    public function storeBanner($input)
    {
        // 如果 transaction 里面出现了异常，会直接往上抛出；如果事务没出问题完整执行，那么返回的就是 null
        DB::transaction(function () use ($input) {
            $imgs           = $input['imgs'];
            $bannerId       = $input['banner_id'];
            $bannerData     = [
                'name'        => $input['name'],
                'description' => $input['description']
            ];
            $bannerItemData = [];

            if (!is_null($input['banner_id'])) {
                // 编辑 banner 位
                Banner::query()->where('id', $bannerId)->update($bannerData);

                // 编辑 banner item
                foreach ($imgs as $key => $img) {
                    // 如果 $img 里只有 save_path 和 access_path 这两个变量，说明是新增的图片
                    $img        = json_decode($img);
                    $bannerItem = [
                        'banner_id' => $bannerId, 'img' => $img->img->save_path, 'sort' => $key
                    ];
                    if (!isset($img->banner_id)) {
                        $bannerItemData[] = $bannerItem;
                    } else {
                        BannerItem::query()->where('id', $img->id)->update($bannerItem);
                    }
                }
                BannerItem::query()->insert($bannerItemData);
            } else {
                // 新建 banner 位
                $bannerData['user_id'] = $input['user_id'];
                $bannerId              = Banner::query()->insertGetId($bannerData);

                // 新建 banner item
                foreach ($imgs as $key => $img) {
                    $img          = json_decode($img);
                    $bannerItemData[] = [
                        'banner_id' => $bannerId, 'img' => $img->img->save_path, 'sort' => $key
                    ];
                }
                BannerItem::query()->insert($bannerItemData);
            }
        }, 2);
    }
}
